Conv2DBackpropInputFusion

计算二维卷积反向传播的输入梯度(Conv2D backprop input fusion),支持普通卷积、Depthwise 卷积以及 1x1 优化路径,多个核心通过核掩码协同完成批次并行。

\[dx = \text{Conv2D}^\top(dy, w)\]
输入:
  • dy - 输出梯度张量首地址,形状 [batch, out_h, out_w, out_channel]

  • w - 卷积权重张量首地址,形状 [out_channel, kernel_h, kernel_w, in_channel/group]

  • conv_param - 卷积参数结构体地址,包含 stridepaddilationgroup、输入输出维度、批次数及共享工作空间指针等信息。

ConvParameter 字段说明:

  • workspace_ - 指向算子运行时使用的临时工作空间,需满足对齐与容量要求。

  • output_batch_ - 输出梯度 dy 的批次数(通常等于输入批次数)。

  • input_batch_ - 正向输入 x 的批次数,用于与 output_batch_ 校验。

  • input_h_ / input_w_ - 正向输入特征图的高度与宽度。

  • output_h_ / output_w_ - 输出梯度特征图的高度与宽度。

  • input_channel_ / output_channel_ - 输入与输出通道数,需与 group_ 配合满足整除关系。

  • kernel_h_ / kernel_w_ - 卷积核的高与宽。

  • group_ - 组卷积数量,group_ = 1 表示普通卷积。

  • pad_l_ / pad_r_ / pad_u_ / pad_d_ - 分别表示左右上下方向的填充大小。

  • dilation_h_ / dilation_w_ - 核心采样间隔(膨胀系数)。

  • stride_h_ / stride_w_ - 滑动窗口在高、宽方向的步长。

  • buffer_size_ - 分配给 workspace_ 的缓冲区字节数,在运行前需要正确设置。

  • nweights_ - 卷积权重 w 的元素总数,用于内部分块和校验。

  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

输出:
  • dx - 输入梯度张量首地址,形状 [batch, in_h, in_w, in_channel]

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持 fp32 数据类型。

  • MT7004 支持 fp16、fp32 数据类型。

  • 需在 conv_param->workspace_ 中预先分配共享工作空间,并设置 conv_param->buffer_size_

共享存储版本:

void hp_conv2dbackpropinputfusion_s(const half *dy, const half *w, half *dx, ConvParameter *conv_param, int core_mask)
void fp_conv2dbackpropinputfusion_s(const float *dy, const float *w, float *dx, ConvParameter *conv_param, int core_mask)

C调用示例:

 1// FT78NE 多核示例
 2#include <stdio.h>
 3#include "conv_parameter.h"
 4
 5int main(void) {
 6    const float *dy = (const float *)0xA0000000;   // DDR 存储
 7    const float *w = (const float *)0xB0000000;
 8    float *dx = (const float *)0xC0000000;
 9    ConvParameter *param = (ConvParameter *)0xB0001000;  // 卷积参数共享区域
10    // 设置 ConvParameter 字段
11    param->workspace_ = (void *)0xB0002000;               // 共享工作空间
12    param->buffer_size_ = 0x20000;
13    param->input_batch_ = 1;
14    param->input_h_ = 5;
15    param->input_w_ = 5;
16    param->input_channel_ = 4;
17    param->output_batch_ = 1;
18    param->output_h_ = 3;
19    param->output_w_ = 3;
20    param->output_channel_ = 8;
21    param->kernel_h_ = 3;
22    param->kernel_w_ = 3;
23    param->group_ = 1;
24    param->pad_u_ = 1;
25    param->pad_d_ = 1;
26    param->pad_l_ = 1;
27    param->pad_r_ = 1;
28    param->dilation_h_ = 1;
29    param->dilation_w_ = 1;
30    param->stride_h_ = 2;
31    param->stride_w_ = 2;
32    param->nweights_ = 8 * 3 * 3 * 4;  // 示例值
33    int core_mask = 0xff;
34    fp_conv2dbackpropinputfusion_s(dy, w, dx, param, core_mask);
35    return 0;
36}

私有存储版本:

void hp_conv2dbackpropinputfusion_p(const half *dy, const half *w, half *dx, ConvParameter *conv_param)
void fp_conv2dbackpropinputfusion_p(const float *dy, const float *w, float *dx, ConvParameter *conv_param)

C调用示例:

 1// MT7004 单核示例
 2#include <stdio.h>
 3#include "conv_parameter.h"
 4
 5int main(void) {
 6    const half *dy = (const half *)0x10000000;   // L2 存储
 7    const half *w = (const half *)0x10020000;
 8    half *dx = (half *)0x10040000;
 9    ConvParameter *param = (ConvParameter *)0x10060000;
10    // 设置 ConvParameter 字段
11    param->workspace_ = (void *)0x10070000;
12    param->buffer_size_ = 0x10000;
13    param->input_batch_ = 1;
14    param->input_h_ = 5;
15    param->input_w_ = 5;
16    param->input_channel_ = 4;
17    param->output_batch_ = 1;
18    param->output_h_ = 3;
19    param->output_w_ = 3;
20    param->output_channel_ = 8;
21    param->kernel_h_ = 3;
22    param->kernel_w_ = 3;
23    param->group_ = 1;
24    param->pad_u_ = 1;
25    param->pad_d_ = 1;
26    param->pad_l_ = 1;
27    param->pad_r_ = 1;
28    param->dilation_h_ = 1;
29    param->dilation_w_ = 1;
30    param->stride_h_ = 2;
31    param->stride_w_ = 2;
32    param->nweights_ = 8 * 3 * 3 * 4;  // 示例值
33    hp_conv2dbackpropinputfusion_p(dy, w, dx, param);
34    return 0;
35}